package Day022_XML_Dom4j.demo2_Dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.util.List;

/**
 * @author zhangyan
 * @date 2020/5/16 14:03
 */
/*
            XPath使用步骤
                步骤1：导入jar包(dom4j和jaxen-1.1-beta-6.jar)
                步骤2：通过dom4j的SaxReader解析器对象,获取Document对象
                步骤3： 利用Xpath提供的api,结合xpaht的语法完成选取XML文档元素节点进行解析操作。
            document常用的api
                - document.selectSingleNode("xpath语法路径");   获得一个节点(标签,元素)
                - document.selectNodes("xpath语法路径");      获得多个节点(标签,元素)
            xpath语法路径:
                1. 绝对路径表达式方式	     例如: /元素/子元素/子子元素...
                2. 相对路径表达式方式          例如: 子元素/子子元素..  或者 ./子元素/子子元素..
                3. 全文搜索路径表达式方式  例如: //子元素//子子元素
                4. 谓语（条件筛选）方式      例如: //元素[@attr1=value]

            绝对路径: 以/开头的路径就叫做绝对路径了,绝对路径要从根元素开始
            相对路径: 相对当前标签而言,不以/开头   ../表示上一个元素, ./表示当前元素
            全文搜索路径: 不论有多少层路径,直接获取满足路径的标签
            谓语方式: 条件筛选,根据条件过滤判断进行筛选标签
*/

public class Test3_XPath {
    public static void main(String[] args) throws Exception{
        method02();

    }

    //谓语方式
    private static void method04() throws DocumentException {
        // 1.创建解析器对象
        SAXReader sr = new SAXReader();

        // 2.通过解析器对象获取Document对象
        Document document = sr.read("Demo02\\src\\Day022_XML_Dom4j\\demo1_XML\\tianqi.xml");

        // 3.使用Document对象结合Xpath路径,来直接获取想要的元素或者属性
        // 获取根路径
        Element rootE = document.getRootElement();

        // 需求: 寻找所有最高温度的level属性值为C的标签
        List<Element> list = rootE.selectNodes("//最高温度[@level='C']");
        System.out.println(list.size());
        for (Element e : list) {
            System.out.println("标签名:" + e.getName() + ",文本:" + e.getText());
        }
    }

    //  全文搜索路径:获取所有的湿度标签的文本和名称
    private static void method03() throws DocumentException {
        // 1.创建解析器对象
        SAXReader sr = new SAXReader();

        // 2.通过解析器对象获取Document对象
        Document document = sr.read("Demo02\\src\\Day022_XML_Dom4j\\demo1_XML\\tianqi.xml");

        // 3.使用Document对象结合Xpath路径,来直接获取想要的元素或者属性
        // 获取根路径
        Element rootE = document.getRootElement();
        // 需求:获取所有的湿度标签的文本和名称
        List<Element> list = rootE.selectNodes("//湿度");
        for (Element e : list) {
            System.out.println("标签名:" + e.getName() + ",文本:" + e.getText());
        }
    }

    // 相对路径: 获取深圳标签下的湿度子标签的标签名和文本
    private static void method02() throws DocumentException {
        // 1.创建解析器对象
        SAXReader sr = new SAXReader();

        // 2.通过解析器对象获取Document对象
        Document document = sr.read("Demo02\\src\\Day022_XML_Dom4j\\demo1_XML\\tianqi.xml");

        // 3.使用Document对象结合Xpath路径,来直接获取想要的元素或者属性
        // 相对路径: 获取深圳标签下的湿度子标签的标签名和文本
        // 获取根标签
        Element rootE = document.getRootElement();
        Node node = rootE.selectSingleNode("./深圳/湿度");
        System.out.println("标签名:" + node.getName() + ",文本:" + node.getText());// 标签名:湿度,文本:50%

        System.out.println("=============================");
        // 获取北京标签下的温度标签
        Node node2 = rootE.selectSingleNode("./北京");
        System.out.println("标签名:" + node2.getName());// 温度


        // 需求:使用node2去获取北京标签下的湿度标签
        Node node3 = node2.selectSingleNode("./湿度");
        System.out.println("标签名:" + node3.getName() + ",文本:" + node3.getText());// 标签名:湿度,文本:20%

        Node node4 = node2.selectSingleNode("./温度/最高温度");
        System.out.println("标签名:" + node4.getName() + ",文本:" + node4.getText());

    }

    // 绝对路径: 获取北京标签下的湿度标签的标签名和文本
    private static void method01() throws DocumentException {
        // 1.创建解析器对象
        SAXReader sr = new SAXReader();

        // 2.通过解析器对象获取Document对象
        Document document = sr.read("Demo02\\src\\Day022_XML_Dom4j\\demo1_XML\\tianqi.xml");

        // 3.使用Document对象结合Xpath路径,来直接获取想要的元素或者属性
        // 绝对路径: 获取北京标签下的湿度标签的标签名和文本
        Node node = document.selectSingleNode("/天气预报/北京/湿度");
        System.out.println("标签名:" + node.getName() + ",文本:" + node.getText());
    }
}

